home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Chat & Communication / Digsby build 37 / digsby_setup.exe / lib / PIL / BmpImagePlugin.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-13  |  6KB  |  173 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. __version__ = '0.7'
  5. import string
  6. import Image
  7. import ImageFile
  8. import ImagePalette
  9.  
  10. def i16(c):
  11.     return ord(c[0]) + (ord(c[1]) << 8)
  12.  
  13.  
  14. def i32(c):
  15.     return ord(c[0]) + (ord(c[1]) << 8) + (ord(c[2]) << 16) + (ord(c[3]) << 24)
  16.  
  17. BIT2MODE = {
  18.     1: ('P', 'P;1'),
  19.     4: ('P', 'P;4'),
  20.     8: ('P', 'P'),
  21.     16: ('RGB', 'BGR;16'),
  22.     24: ('RGB', 'BGR'),
  23.     32: ('RGB', 'BGRX') }
  24.  
  25. def _accept(prefix):
  26.     return prefix[:2] == 'BM'
  27.  
  28.  
  29. class BmpImageFile(ImageFile.ImageFile):
  30.     format = 'BMP'
  31.     format_description = 'Windows Bitmap'
  32.     
  33.     def _bitmap(self, header = 0, offset = 0):
  34.         if header:
  35.             self.fp.seek(header)
  36.         
  37.         read = self.fp.read
  38.         s = read(4)
  39.         s = s + ImageFile._safe_read(self.fp, i32(s) - 4)
  40.         if len(s) == 12:
  41.             bits = i16(s[10:])
  42.             self.size = (i16(s[4:]), i16(s[6:]))
  43.             compression = 0
  44.             lutsize = 3
  45.             colors = 0
  46.         elif len(s) in (40, 64):
  47.             bits = i16(s[14:])
  48.             self.size = (i32(s[4:]), i32(s[8:]))
  49.             compression = i32(s[16:])
  50.             lutsize = 4
  51.             colors = i32(s[32:])
  52.         else:
  53.             raise IOError('Unsupported BMP header type (%d)' % len(s))
  54.         if not colors:
  55.             colors = 1 << bits
  56.         
  57.         
  58.         try:
  59.             (self.mode, rawmode) = BIT2MODE[bits]
  60.         except KeyError:
  61.             raise IOError('Unsupported BMP pixel depth (%d)' % bits)
  62.  
  63.         if compression == 3:
  64.             mask = (i32(read(4)), i32(read(4)), i32(read(4)))
  65.             if bits == 32 and mask == (16711680, 65280, 255):
  66.                 rawmode = 'BGRX'
  67.             elif bits == 16 and mask == (63488, 2016, 31):
  68.                 rawmode = 'BGR;16'
  69.             elif bits == 16 and mask == (31744, 992, 31):
  70.                 rawmode = 'BGR;15'
  71.             else:
  72.                 raise IOError('Unsupported BMP bitfields layout')
  73.         elif compression != 0:
  74.             raise IOError('Unsupported BMP compression (%d)' % compression)
  75.         
  76.         if self.mode == 'P':
  77.             palette = []
  78.             greyscale = 1
  79.             if colors == 2:
  80.                 indices = (0, 255)
  81.             else:
  82.                 indices = range(colors)
  83.             for i in indices:
  84.                 rgb = read(lutsize)[:3]
  85.                 if rgb != chr(i) * 3:
  86.                     greyscale = 0
  87.                 
  88.                 palette.append(rgb)
  89.             
  90.             if greyscale:
  91.                 if colors == 2:
  92.                     self.mode = rawmode = '1'
  93.                 else:
  94.                     self.mode = rawmode = 'L'
  95.             else:
  96.                 self.mode = 'P'
  97.                 self.palette = ImagePalette.raw('BGR', string.join(palette, ''))
  98.         
  99.         if not offset:
  100.             offset = self.fp.tell()
  101.         
  102.         self.tile = [
  103.             ('raw', (0, 0) + self.size, offset, (rawmode, self.size[0] * bits + 31 >> 3 & -4, -1))]
  104.         self.info['compression'] = compression
  105.  
  106.     
  107.     def _open(self):
  108.         s = self.fp.read(14)
  109.         if s[:2] != 'BM':
  110.             raise SyntaxError('Not a BMP file')
  111.         
  112.         offset = i32(s[10:])
  113.         self._bitmap(offset = offset)
  114.  
  115.  
  116.  
  117. class DibImageFile(BmpImageFile):
  118.     format = 'DIB'
  119.     format_description = 'Windows Bitmap'
  120.     
  121.     def _open(self):
  122.         self._bitmap()
  123.  
  124.  
  125.  
  126. def o16(i):
  127.     return chr(i & 255) + chr(i >> 8 & 255)
  128.  
  129.  
  130. def o32(i):
  131.     return chr(i & 255) + chr(i >> 8 & 255) + chr(i >> 16 & 255) + chr(i >> 24 & 255)
  132.  
  133. SAVE = {
  134.     '1': ('1', 1, 2),
  135.     'L': ('L', 8, 256),
  136.     'P': ('P', 8, 256),
  137.     'RGB': ('BGR', 24, 0) }
  138.  
  139. def _save(im, fp, filename, check = 0):
  140.     
  141.     try:
  142.         (rawmode, bits, colors) = SAVE[im.mode]
  143.     except KeyError:
  144.         raise IOError('cannot write mode %s as BMP' % im.mode)
  145.  
  146.     if check:
  147.         return check
  148.     
  149.     stride = (im.size[0] * bits + 7) / 8 + 3 & -4
  150.     header = 40
  151.     offset = 14 + header + colors * 4
  152.     image = stride * im.size[1]
  153.     fp.write('BM' + o32(offset + image) + o32(0) + o32(offset))
  154.     fp.write(o32(header) + o32(im.size[0]) + o32(im.size[1]) + o16(1) + o16(bits) + o32(0) + o32(image) + o32(1) + o32(1) + o32(colors) + o32(colors))
  155.     fp.write('\x00' * (header - 40))
  156.     if im.mode == '1':
  157.         for i in (0, 255):
  158.             fp.write(chr(i) * 4)
  159.         
  160.     elif im.mode == 'L':
  161.         for i in range(256):
  162.             fp.write(chr(i) * 4)
  163.         
  164.     elif im.mode == 'P':
  165.         fp.write(im.im.getpalette('RGB', 'BGRX'))
  166.     
  167.     ImageFile._save(im, fp, [
  168.         ('raw', (0, 0) + im.size, 0, (rawmode, stride, -1))])
  169.  
  170. Image.register_open(BmpImageFile.format, BmpImageFile, _accept)
  171. Image.register_save(BmpImageFile.format, _save)
  172. Image.register_extension(BmpImageFile.format, '.bmp')
  173.